package com.tfjybj.itoo.exam.provider.service;

import com.dmsdbj.itoo.tool.base.service.BaseServicePlus;
import com.dmsdbj.itoo.tool.business.ItooResult;
import com.github.pagehelper.PageInfo;
import com.tfjybj.itoo.exam.entity.QuestionEntity;
import com.tfjybj.itoo.exam.model.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.Serializable;
import java.util.List;


/**
 * QuestionService接口
 * question表
 *
 * @author 李青松
 * @version 2.0.0
 * @since 2.0.0 2018-11-01 08:55:53
 */
public interface QuestionService extends BaseServicePlus<QuestionEntity> {

    //region 模板生成：模糊查询

    /**
     * 根据编号模糊查询question
     *
     * @param serial   编号
     * @param pageNo   页码
     * @param pageSize 页数
     * @return 模糊查询的question
     * @author 李青松
     * @since 2.0.0 2018-11-01 08:55:53
     */
    PageInfo<QuestionEntity> queryByLikeSerial(String serial, Integer pageNo, Integer pageSize);

    PageInfo<QuestionEntity> questionEntityPageInfo(Integer pageNum, Integer pageSize);
    //endregion

    /* **********************************以下为非模板生成的内容********************************* */

    /**
     * 根据题干实体查询试题集合
     *
     * @param questionEntity QuestionEntity
     * @return List
     * @author 郭凯
     * @since 2.0.0 2018-11-8 15:47:09
     */
    List<QueryQuestionModel> queryByEntity(@Param("questionEntity") QuestionEntity questionEntity);


    /**
     * 根据题干实体查询试题集合
     *
     * @param pageNo   页码
     * @param pageSize 记录数
     * @param operator 操作人
     * @return PageInfo
     * @author 郭凯
     * @since 2.0.0 2018-11-8 15:47:09
     */
    PageInfo<QuestionModelForHomePage> queryQuestionModelPageInfo(Integer pageNo, Integer pageSize, String operator);


    /**
     * 分解题干
     *
     * @param questionModels QuestionAddModel
     * @return List
     * @author 郭凯
     * @since 2.0.0 2018-11-8 15:48:01
     */
    List<QuestionAddModel> queryProblem(List<QuestionAddModel> questionModels);


    /**
     * 题库检查点6: 检查重复试题.--------所有题型
     *
     * @param operator       String
     * @param questionTypeId String
     * @return List
     * @author 邓立瑶
     * @since 1.0.0 2018年11月10日09:20:32
     */
    List<QuestionModelForHomePage> checkRepeatedQuestions(String operator, String questionTypeId);


    /**
     *  分页 检查重复试题
     * @param pageNo
     * @param pageSize
     * @param operator
     * @param questionTypeId
     * @return
     * @author 杜雨
     * @since 1.0.0 2019年5月29日15:25:37
     */
    PageInfo<QuestionModelForHomePage> checkRepeatedQuestionsPageInfo(Integer pageNo, Integer pageSize, String operator, String questionTypeId);



    /**
     * 添加试题
     *
     * @param model 添加试题使用的Model集合
     * @return ItooResult
     * @author 郭凯
     * @since 2.0.0 2018-11-8 15:48:01
     */
    ItooResult createQuestion(@RequestBody List<QuestionAddModel> model);


    QuestionEntity getById(Serializable id);

    boolean removeById(Serializable id);

    boolean updateById(QuestionEntity questionEntity);

    /**
     * 根据id删除试题
     *
     * @param id 试题id
     * @return Boolean
     * @author 郭凯
     * @since 2.0.0 2018-11-8 15:48:01
     */
    boolean updateIsDelete(String id);

    /**
     * 更新试题检查结果
     *
     * @param id          试题id
     * @param checkResult 试题检查结果
     * @return Boolean
     * @author 郭凯
     * @since 2.0.0 2018-11-8 15:48:01
     */
    boolean updateCheckResult(String id, String checkResult);

    /**
     * 查询试题类型名称
     *
     * @param operator       操作人
     * @param questionTypeId 试题类型id
     * @return List
     * @author 郭凯
     * @since 2.0.0 2018-11-8 15:48:01
     */
    List<QueryQuestionTypeModel> queryQuestionTypeName(@RequestBody String operator, String questionTypeId);

    /**
     * 查询试题类型名称
     *
     * @param courseId 课程id
     * @param operator 操作人
     * @return List
     * @author 任蒙蒙
     * @since 2.0.0 2018-12-1 15:48:01
     */
    List<QuestionMainModel> queryAllProblemByCourseId(String courseId, String operator);

    /**
     * 查询必抽题父题对应的子题（混合题用）
     *
     * @param parentId 父题干id
     * @return List
     * @author 任蒙蒙
     * @since 2.0.0 2018-12-16 11:23:01
     */
    List<QuestionMainModel> selectSubQuestionByParentId(String parentId);

    /**
     * 查询试题类型名称
     *
     * @param questionTypeId     题型id
     * @param operator           操作人
     * @param courseId           课程id
     * @param questionClassifyId 试题分类id
     * @return List
     * @author 杨海云
     * @since 2.0.0 2018-12-1 15:48:01
     */

    List<QuestionModel> queryQuestionDegree(String questionTypeId, String operator, String courseId, String questionClassifyId);


    /**
     * 根据操作人和课程id查询试题分类
     *
     * @param operator 操作人
     * @param courseId 课程id
     * @return List
     * @author 郭凯
     * @since 2.0.0 2018-12-1 15:48:01
     */
    List<String> queryQuestionClassifyType(String operator, String courseId);

    /**
     * 分页根据试题内容模糊查询question
     *
     * @param content  试题内容
     * @param operator 操作人
     * @param pageNo   页码
     * @param pageSize 每页数量
     * @return 模糊查询的question
     * @author 郭凯
     * @since 2.0.0 2018-11-01 08:55:53
     */
    PageInfo<QuestionModelForHomePage> queryByLikeContent(String content, String operator, Integer pageNo, Integer pageSize);


    /**
     * 指导入试题
     *
     * @param multipartFile 文件
     * @param request       要求
     * @param response      返回
     * @param quesType      试题类型id
     * @param quesName      试题类型名称
     * @param courseId      课程id
     * @param operator      操作人
     * @return itooResult 返回值
     * @author 侯旭日
     * @since 2.0.0 2018-11-28 19:40:28
     */
    ItooResult importTemplate(MultipartFile multipartFile, HttpServletRequest request, HttpServletResponse response, String quesType, String quesName, String courseId, String operator);

    /**
     * 导出导入异常的试题
     *
     * @param errorListId
     * @param response
     * @return
     * @author 李娜
     */
    boolean exportErrorList(String errorListId, HttpServletResponse response);

    /**
     * 根据id查找Question
     *
     * @param id 主键id
     * @return 根据id查找Question
     * @author 郭凯
     * @since 2.0.0 2018-12-1 15:53:12
     */
    QuestionAddModel queryById(String id);


    List<QuestionMainModel> selectQuestionByParentId(String courseId, String operator);


    /**
     * 设置必抽题
     *
     * @param operator       操作人
     * @param courseId       课程id
     * @param questionTypeId 题型id
     * @return 根据id查找Question
     * @author 郭凯
     * @since 2.0.0  2018-12-8 10:27:31
     */
    List<QueryQuestionModel> queryMustSelect(String operator, String courseId, String questionTypeId);

    /**
     * 根据操作人查询题型类型
     *
     * @param operator 操作人
     * @return ItooResult 根据操作人查询题型类型
     * @author 贾建清
     * @since 2.0.0 2018-12-13 16:02:36
     */
    List<OperatorQuestionModel> queryQuestionType(String operator);

    /**
     * 根据操作人和题型类型查询试题
     *
     * @param operator       操作员
     * @param questionTypeId 题型
     * @param pageNo         页码
     * @param pageSize       页数
     * @return ItooResult 根据操作人和题型类型查询试题
     * @author 贾建清
     * @since 2.0.0 2018-12-13 17:46:44
     */
    PageInfo<QuestionModel> queryQuestion(String operator, String[] questionTypeId, Integer pageNo, Integer pageSize);

    /**
     * question_Classify 模糊查询必抽题
     *
     * @param searchInput    查询内容
     * @param courseId       课程id
     * @param questionTypeId 题型id
     * @param operator       操作人
     * @return pageInfo 页码信息
     * @author 杨海云
     * @since 2.0.0 2018-12-5 13:27:08
     */
    PageInfo<QuestionModel> indistinctQuestionClassify(String searchInput, String courseId, String questionTypeId, String operator);

    /**
     * 根据课程/试题题型/分类查询试题
     *
     * @param questionEntity 试题实体
     * @param pageNo         页码
     * @param pageSize       页数
     * @return ItooResult 根据课程/试题题型/分类查询试题
     * @author 贾建清
     * @since 2.0.0 2018-12-16 14:55:14
     */
    PageInfo<QuestionModelForHomePage> queryQuestionByType(QuestionEntity questionEntity, Integer pageNo, Integer pageSize);

    /**
     * 根据课程id查询课程类型
     *
     * @param courseId
     * @return
     * @author 李娜
     */
    List<QuestionTypeModel> queryQuestionTypeByCourse(String courseId);

    List<QuestionEntity> selectQuestionByCourse(String courseId);

    /**
     * 批量删除试题
     *
     * @param questionIds
     * @author 李娜
     */
    void deleteQuestionBatch(List<String> questionIds);

    /**
     * 检查json格式是否正确
     *
     * @param courseId       课程id
     * @param questionTypeId 题型id
     * @return ItooResult
     * @author 郭凯
     * @since 2.0.0  2019-1-16 15:14:38
     */
    ItooResult checkJSON(String courseId, String questionTypeId);

    /**
     * 根据旧题的Id查询旧题题干内容
     *
     * @param oldQuestionId 旧题 Id
     * @return oldQuesitonContent 旧题题干内容
     * @author 任蒙蒙
     * @since 2.0.0 2018-11-17 17:10:28
     */
    String selectOldQuestion(String oldQuestionId);

    /**
     * 根据新题的Id查询新题的model
     *
     * @param newQuestionId 新题Id
     * @return List
     * @author 任蒙蒙
     * @since 2.0.0 2018-12-29 10:10:01
     */
    QuestionMainModel selectNewQuestionModel(String newQuestionId);

    /**
     * 根据旧题id查询新题id
     *
     * @param questionId 旧题id
     * @return ItooResult
     * @author 郭凯
     * @since 2.0.0  2019-1-16 15:14:38
     */
    List<QuestionEntity> selectNewQuestionById(String questionId);

    /**
     * 根据课程id,题型id,章节id筛选题
     *
     * @param courseId           课程id
     * @param questionTypeId     试卷类型id
     * @param questionClassifyId 试卷分类
     * @param operator           登录人
     * @return 符合筛选条件的集合
     * @author 马莹
     * @since 2019-1-31 10:09:00
     */
    List<QuestionMainModel> selectQuestion(String courseId, String questionTypeId, String questionClassifyId, String operator);


    /**
     * @param operator       操作人id
     * @param questionTypeId 试题类型id
     * @return List<QuestionModelForHomePage>
     * @Description 检查选项数量
     * @author 刁琳童
     * @since 2.0.0 2019/3/24 8:28
     */
    List<QuestionModelForHomePage> checkRadioNumQuestions(String operator, String questionTypeId);

    /**
     * @param operator       操作人id
     * @param questionTypeId 试题类型id
     * @return List<QuestionModelForHomePage>
     * @Description 检查选项是否为空
     * @author 刁琳童
     * @since 2.0.0 2019/3/24 8:30
     */
    List<QuestionModelForHomePage> checkRadioNullQuestions(String operator, String questionTypeId);

    /**
     * @param operator       操作人id
     * @param questionTypeId 试题类型id
     * @return List<QuestionModelForHomePage>
     * @Description 检查选项重复
     * @author 刁琳童
     * @since 2.0.0 2019/3/24 8:31
     */
    List<QuestionModelForHomePage> checkRadioRepeatQuestions(String operator, String questionTypeId);

    /**
     * @param operator       操作人id
     * @param questionTypeId 试题类型id
     * @return List<QuestionModelForHomePage>
     * @Description 检查选择题题干选项是否重复
     * @author 刁琳童
     * @since 2.0.0 2019/3/24 8:32
     */
    List<QuestionModelForHomePage> checkContentRepeatQuestions(String operator, String questionTypeId);

    /**
     * @param operator       操作人id
     * @param questionTypeId 试题类型id
     * @return List<QuestionModelForHomePage>
     * @Description 检查除了选择题之外的题选项是否为空
     * @author 刁琳童
     * @since 2.0.0 2019/3/24 8:31
     */
    List<QuestionModelForHomePage> checkContentRepeatExecptRadioQuestions(String operator, String questionTypeId);

    /**
     * @param operator       操作人id
     * @param questionTypeId 试题类型id
     * @return
     * @Description 检查题目是否完全重复，通过题干和答案来判断
     * @author 刁琳童
     * @since 2.0.0 2019/3/24 8:36
     */
    List<QuestionModelForHomePage> checkCompleteRepeatQuestions(String operator, String questionTypeId);

//    boolean modify();


    /**
     * 题库检查点: 检查重复试题编号
     *
     * @param serial       String
     * @return List
     * @author duyu
     * @since 2019年5月26日11:26:32
     */
    List<QuestionEntity> checkSerial(String serial, String operator);
}
